package cn.scs.common;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

/**
 *此处是枚举类
 * enum 定义的枚举类默认继承了 java.lang.Enum 类，并实现了 java.lang.Serializable 和 java.lang.Comparable 两个接口。
 * values(), ordinal() 和 valueOf() 方法位于 java.lang.Enum 类中：
 * values() 返回枚举类中所有的值。
 * ordinal()方法可以找到每个枚举常量的索引，就像数组索引一样。
 * valueOf()方法返回指定字符串值的枚举常量。
 **/
public enum MetaOpCode {
    HEART_BEAT((byte)30),
    CREATE_FILE((byte)31),
    RENAME_FILE((byte)32),
    DEL_FILE((byte)33),
    LIST_FILE((byte)34),
    APPLY_BLOCK((byte)35),  // 申请块
    DOWNLOAD_FILE((byte)36),   // 申请查询 Loaction
    DFS_CLIENT_EXIT((byte)37);   // DFS 客户端退出

    public final byte code;

    private MetaOpCode(byte code) {
        this.code = code;
    }

    private static final int FIRST_CODE = values()[0].code;

    private static MetaOpCode valueOf(byte code) {
        //此处 & 0xff的作用——保留低8位
        final int i = (code & 0xff) - FIRST_CODE;
        return i < 0 || i >= values().length? null: values()[i];
    }

    public static MetaOpCode read(DataInput in) throws IOException {
        return valueOf(in.readByte());
    }
    /**
     * 用于将给定值作为一字节值写入基本流，并且成功执行时变量计数器加1。
     **/
    public void write(DataOutput out) throws IOException {
        out.writeByte(code);
    }
}
